// 把对象转换成 查询字符串
function querystringify(obj) {
    let str = ''
  
    for (var key in obj) {
      str += key + '=' + obj[key] + '&'
    }
  
    return str.slice(0, -1)
  }
  
  /*
    2. 设置一套默认值
  */
  function ajax(options = {}) {
    
    if (!options.url) {
      throw new Error('url 为必填选项, 请填写 ^_^')
    }
    if (!(options.method === undefined || /^(get|post)$/i.test(options.method))) {
      throw new Error('目前版本只接受 GET 和 POST 请求, 请期待更新 !! (#^.^#)')
    }
    if (!(options.async === undefined || typeof options.async === 'boolean')) {
      throw new Error('async 只能传递 布尔值, 请检查后操作')
    }
    if (!(options.data === undefined || typeof options.data === 'string')) {
      throw new Error('data 需要传递一个 字符串 格式')
    }
  
    if (!(options.token === undefined || typeof options.token === 'string')) {
      throw new Error('token 需要传递一个 字符串 格式')
    }
  
    if (!(options.dataType === undefined || /^(string|json)$/i.test(options.dataType))) {
      throw new Error('dataType 需要传递一个 string/ json 格式')
    }
  
    if (!(options.success === undefined || typeof options.success === 'function')) {
      throw new Error('success 需要传递一个 函数 格式')
    }
  
    // 2. 设置一套默认值
    const _default = {
      url: options.url,
      method: options.method || 'GET',
      async: typeof options.async === 'boolean' ? options.async : true,
      data: options.data || '',
      token: options.token || '',
      dataType : options.dataType || 'string',
      success : options.success ||function() {}
    }
   
    if (_default.method.toUpperCase() === 'GET' && _default.data) {
    
      _default.url += '?' + _default.data
    }
  
    const xhr = new XMLHttpRequest()
  
    xhr.open(_default.method, _default.url, _default.async)
    xhr.onload = function () {
      const result = _default.dataType.toUpperCase() === 'JSON' ? JSON.parse(xhr.responseText) : xhr.responseText
      _default.success(result)
    }
  
    if (_default.token) xhr.setRequestHeader('authorization', _default.token)
  
    if (_default.method.toUpperCase() === 'POST') xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded')
    _default.method.toUpperCase() === 'POST' ? xhr.send(_default.data) : xhr.send()
  }
  
  // 二次封装
  function pAjax(options={}){
    const p = new Promise((resolve,reject) =>{
      ajax({
        url: options.url,
        data: options.data,
        token: options.token,
        async: options.async,
        method: options.method,
        dataType: options.dataType,
        success: function (res) {
          resolve(res)
        }
      })
      
    })
    return p
  }